
#include "UdpServer.hpp"
#include <memory>

//UDP_socket是全双工的：全双工指通信双方可以同时、双向发送和接收数据，且彼此独立
//即：允许被同时读写
//一个线程不断读、一个线程不断写

Log log;
void Usage(string proc)
{
    cout << "\n\tUsage:" << proc << "port[1024+ ]\n" << endl;
}

string Handler(const string& str, const uint16_t& clientport, const string& clientip)
{
    cout << "[" << clientip << ":" << clientport << "]# " << str << endl;
    string s = "Server get a message: ";
    s += str;
    cout << s <<endl;
    return s;
}
int main(int argc, char* argv[])//使用命令行参数区别端口号./udpserver 8080
{
    if(argc != 2)// ./udpsever是第0位，prot是第1位，超出就出错
    {
        Usage(argv[0]);
        exit(0);
    }
    uint16_t port = stoi(argv[1]);
    unique_ptr<UdpServer> svr(new UdpServer(port));
    //unique_ptr<UdpServer> svr(new UdpServer(8080,"8.137.49.16"));
    //bind error, error: 99, errno string: Cannot assign requested address
    //云服务器 禁止直接绑定公网ip->绑定sock时，将ip设为0（动态绑定ip）,凡是发给这台主机的数据，都要根据端口号向上交付

    //[0~1023]:属于系统内定端口号，一般需要有固定的应用层协议使用
    //http:80、https:443、mysql:3306
    //1024以上的端口自己绑定


    svr->Init();
    svr->Run(Handler);
    return 0;
}